package cn.cyh.queue_service.exception;

import cn.cyh.queue_service.common.ResultCode;
import lombok.Getter;

/**
 * 外部服务调用异常
 * 用于封装调用外部服务（如人脸识别服务）时产生的异常
 */
@Getter
public class ExternalServiceException extends RuntimeException {
    
    /**
     * 结果码
     */
    private final ResultCode resultCode;
    
    /**
     * 服务名称
     */
    private final String serviceName;
    
    /**
     * 重试次数
     */
    private final int retryCount;
    
    /**
     * 最大重试次数
     */
    private final int maxRetries;
    
    /**
     * 构造函数
     *
     * @param message 异常消息
     * @param serviceName 服务名称
     */
    public ExternalServiceException(String message, String serviceName) {
        this(message, serviceName, ResultCode.EXTERNAL_SERVICE_ERROR);
    }
    
    /**
     * 构造函数
     *
     * @param message 异常消息
     * @param serviceName 服务名称
     * @param resultCode 结果码
     */
    public ExternalServiceException(String message, String serviceName, ResultCode resultCode) {
        this(message, serviceName, resultCode, 0, 0);
    }
    
    /**
     * 构造函数
     *
     * @param message 异常消息
     * @param serviceName 服务名称
     * @param resultCode 结果码
     * @param retryCount 重试次数
     * @param maxRetries 最大重试次数
     */
    public ExternalServiceException(String message, String serviceName, ResultCode resultCode, int retryCount, int maxRetries) {
        super(message);
        this.serviceName = serviceName;
        this.resultCode = resultCode;
        this.retryCount = retryCount;
        this.maxRetries = maxRetries;
    }
    
    /**
     * 构造函数
     *
     * @param message 异常消息
     * @param cause 原始异常
     * @param serviceName 服务名称
     */
    public ExternalServiceException(String message, Throwable cause, String serviceName) {
        this(message, cause, serviceName, ResultCode.EXTERNAL_SERVICE_ERROR);
    }
    
    /**
     * 构造函数
     *
     * @param message 异常消息
     * @param cause 原始异常
     * @param serviceName 服务名称
     * @param resultCode 结果码
     */
    public ExternalServiceException(String message, Throwable cause, String serviceName, ResultCode resultCode) {
        this(message, cause, serviceName, resultCode, 0, 0);
    }
    
    /**
     * 构造函数
     *
     * @param message 异常消息
     * @param cause 原始异常
     * @param serviceName 服务名称
     * @param resultCode 结果码
     * @param retryCount 重试次数
     * @param maxRetries 最大重试次数
     */
    public ExternalServiceException(String message, Throwable cause, String serviceName, ResultCode resultCode, int retryCount, int maxRetries) {
        super(message, cause);
        this.serviceName = serviceName;
        this.resultCode = resultCode;
        this.retryCount = retryCount;
        this.maxRetries = maxRetries;
    }
} 